package com.simon.train.common.ControllerException;

//import com.simon.train.common.exception.BusinessException;
//import com.simon.train.common.resp.CommonResp;

import com.simon.train.common.Result.Result;
import com.simon.train.common.exception.BusinessException;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.validation.BindException;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.method.annotation.MethodArgumentTypeMismatchException;


/**
 * 统一异常处理、数据预处理等
 */
@ControllerAdvice
public class ControllerExceptionHandler {

    private static final Logger LOG = LoggerFactory.getLogger(ControllerExceptionHandler.class);

    /**
     * 所有异常统一处理
     * 应该就是用于统一抓取所有的未知异常信息
     * @param e
     * @return
     */
    @ExceptionHandler(value = Exception.class)
    @ResponseBody
    public Result exceptionHandler(Exception e){
        // LOG.info("seata全局事务ID: {}", RootContext.getXID());
        // // 如果是在一次全局事务里出异常了，就不要包装返回值，将异常抛给调用方，让调用方回滚事务
        // if (StrUtil.isNotBlank(RootContext.getXID())) {
        //     throw e;
        // }
        Result res = new Result();
        LOG.error("系统异常：", e);
        res.setSuccess(false);
        res.setMessage("系统出现异常，请联系管理员");
        //commonResp.setMessage(e.getMessage());
        return res;
    }

    @ExceptionHandler(value = MethodArgumentTypeMismatchException.class)
    @ResponseBody
    public Result DateFormatErrorHandler(MethodArgumentTypeMismatchException e){
        Result res = new Result();
        String error = String.format(
                "参数 '%s' 类型错误，需要 %s 类型，但收到值: %s",
                e.getName(),
                e.getRequiredType().getSimpleName(),
                e.getValue()
        );
        LOG.error(error);
        res.setSuccess(false);
        res.setContent("日期格式错误或日期不能为空");
        return res;
    }

    /**
     * 业务异常统一处理
     * 自定义了一个业务异常BusinessException 进行统一抓取
     * @param e
     * @return
     */
    @ExceptionHandler(value = BusinessException.class)
    @ResponseBody
    public Result exceptionHandler(BusinessException e) {
        Result res = new Result();
        LOG.error("业务异常：{}", e.getBusinessExceptionEnum().getDesc());
        res.setSuccess(false);
        res.setMessage(e.getBusinessExceptionEnum().getDesc());
        return res;
    }


    @ExceptionHandler(value = BindException.class)
    @ResponseBody
    public Result exceptionHandler(BindException e) {
        Result res = new Result();
        LOG.error("校验异常：{}", e.getBindingResult().getAllErrors().get(0).getDefaultMessage());
        res.setSuccess(false);
        res.setMessage(e.getBindingResult().getAllErrors().get(0).getDefaultMessage());
        return res;
    }

}
